1451. Симметрия точек

 

На плоскости задано n разных точек P1, P2, …, Pn. своими координатами (xi, yi), i = 1, …, n. Преобразование S производится следующим образом: для каждой точки X0 плоскости сначала строится точка X1, симметричная ей относительно P1, потом строится точка X2, симметричная X1 относительно P2, и так далее пока не будет построена точка Xn, симметричная Xn-1 относительно Pn. Если при описанном преобразовании S существует единственная точка, которая не изменяет своих координат (неподвижная точка), то вывести ее координаты. Если существует более одной неподвижной точки, то вывести 0. Если неподвижных точек не существует, вывести -1.

 

Вход. Первая строка содержит количество точек n. Следующие n строк содержат целочисленные координаты точек (xi, yi), i = 1, …, n.

 

Выход. Вывести координаты неподвижной точки (x, y), если она единственна. Если существует более одной неподвижной точки, то вывести 0. Если неподвижных точек не существует, вывести -1.

 

Пример входа

Sample 1

4

0 0

0 1

1 1

1 0

 

Sample 2

3

0 0

0 1

1 0

 

Sample 3

4

0 0

1 0

0 1

100 100

 

Пример выхода

Sample 1

0

 

Sample 2

1 -1

 

Sample 3

-1

 

 

РЕШЕНИЕ

геометрия

 

Анализ алгоритма

Точка с координатами (x, y) при симметрии относительно точки (p1, q1) переходит в точку (2p1x, 2qy1). Если полученную точку симметрически отобразить относительно (p2, q2), то получим точку (2p2 – 2p1 + x, 2q2 – 2q1 + y). Продолжая процедуру отображения n раз, в конце получим точку с координатами (2pn– 2pn-1 + 2pn-2 – … + (-1)nx, 2qn– 2qn-1 + 2qn-2 – … + (-1)ny). Ее координаты должны совпадать с координатами исходной точки, то есть

x = 2pn – 2pn-1 + 2pn-2 – … + (-1)nx

y = 2qn– 2qn-1 + 2qn-2 – … + (-1)ny

Для нахождения координат искомой неподвижной точки (x, y) достаточно решить систему двух линейных уравнений. Если n нечетно, то система всегда имеет единственное решение:

x = pnpn-1 + pn-2 – … + p1

y = qnqn-1 + qn-2 – … + q1

При четном n переменные x и y сокращаются, и оба уравнения превращаются в равенства:

0 = pnpn-1 + pn-2 – … – p1

0 = qnqn-1 + qn-2 – … – q1

Если оба равенства истины, то любая точка плоскости является неподвижной. Если хотя бы одно равенство не верно, то неподвижных точек не существует.

 

Реализация алгоритма

В переменной pp будем вычислять значение p1p2 + p3 – … + (-1)npn, а в переменной qq значение q1q2 + q3 – … + (-1)nqn.

 

  scanf("%d",&n);

  pp = qq = 0; dir = 1;

  for(i = 0; i < n; i++)

  {

    scanf("%d %d",&p, &q);

    pp += p * dir; qq += q * dir;

    dir = -dir;

  }

 

Если n нечетно, то выводим неподвижную точку (pp, qq).

 

  if (n % 2) printf("%d %d\n",pp,qq);else

  {

 

Если n четно, то лишь при (pp, qq) = (0, 0), то любая точка плоскости является неподвижной. Если хотя бы одно из значений pp или qq отлично от нуля, то неподвижных точек нет.

 

    if (pp || qq) printf("-1\n");

    else printf("0\n");

  }